package localhost.ejb;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import localhost.model.Categoria;
import localhost.model.Conta;
import localhost.model.Movimento;
import localhost.model.Parcelado;

@Stateless
public class DaoOrcamento {


	@PersistenceContext(unitName = "orcamento")
	EntityManager emOrca;

	public void atualizar(Object o) {
		emOrca.merge(o);
	}

	public void deletar(Object o) {
		emOrca.remove(o);
	}

	public void salvar(Object o) {
		emOrca.merge(o);
	}

	// ################### retorna objetos #####################

	@SuppressWarnings("unchecked")
	public Categoria retornaCategoria(int id) {

		List<Categoria> lista = new ArrayList<Categoria>();
		Categoria cat = new Categoria();

		String query = "SELECT E FROM localhost.model.Categoria E "
				+ "WHERE E.id=:id";
		Query q = emOrca.createQuery(query);
		q.setParameter("id", id);

		lista = q.getResultList();
		if (lista.size() > 0) {
			cat = lista.get(0);
		}

		return cat;

	}
	
	@SuppressWarnings("unchecked")
	public Conta retornaConta(int id) {

		List<Conta> lista = new ArrayList<Conta>();
		Conta conta = new Conta();

		String query = "SELECT E FROM localhost.model.Conta E "
				+ "WHERE E.id=:id";
		Query q = emOrca.createQuery(query);
		q.setParameter("id", id);

		lista = q.getResultList();
		if (lista.size() > 0) {
			conta = lista.get(0);
		}

		return conta;

	}


	// ################### retorna String (total de registros)

	@SuppressWarnings("unchecked")
	public int emUsoCategoria(Categoria c) {
		int resposta = 0;

		String query = "SELECT E FROM localhost.model.Movimento E "
				+ "join fetch E.categoria WHERE E.categoria.id=:id";
		Query q = emOrca.createQuery(query);
		q.setParameter("id", c.getId());

		List<Movimento> lista = q.getResultList();

		if (lista.size() > 0) {
			resposta = lista.size();
		}

		return resposta;
	}
	
	@SuppressWarnings("unchecked")
	public int emUsoConta(Conta c) {
		int resposta = 0;

		String query = "SELECT E FROM localhost.model.Movimento E "
				+ "join fetch E.conta WHERE E.conta.id=:id";
		Query q = emOrca.createQuery(query);
		q.setParameter("id", c.getId());

		List<Movimento> lista = q.getResultList();

		if (lista.size() > 0) {
			resposta = lista.size();
		}

		return resposta;
	}
	/*
	// ################### retorna boleanos(existe) #####################

	@SuppressWarnings("unchecked")
	public boolean existeDotacao(String sigla, int anoref) {
		boolean existe = false;

		String query = "SELECT D FROM br.usp.poli.pecunia.model.Dotacao D "
				+ "join fetch D.local WHERE D.anoref=:anoref and  D.local.sigla=:sigla";
		Query q = emPecunia.createQuery(query);
		q.setParameter("anoref", anoref);
		q.setParameter("sigla", sigla);

		List<Dotacao> dots = q.getResultList();

		if (dots.size() > 0) {
			existe = true;
		}

		return existe;
	}

*/
	// ################### retorna inteiros (excluir) #####################

	public int excluiCategoria(Categoria c) {

		String query = "DELETE FROM localhost.model.Categoria E "
				+ "WHERE E.id=:id";
		Query q = emOrca.createQuery(query);
		q.setParameter("id", c.getId());

		int resp = q.executeUpdate();

		return resp;
	}
	
	public int excluiConta(Conta c) {

		String query = "DELETE FROM localhost.model.Conta E "
				+ "WHERE E.id=:id";
		Query q = emOrca.createQuery(query);
		q.setParameter("id", c.getId());

		int resp = q.executeUpdate();

		return resp;
	}
	
	public int excluiMovimento(Movimento m) {

		String query = "DELETE FROM localhost.model.Movimento E "
				+ "WHERE E.id=:id";
		Query q = emOrca.createQuery(query);
		q.setParameter("id", m.getId());

		int resp = q.executeUpdate();

		return resp;
	}
	
	public int excluiParcelado(Parcelado p) {

		String query = "DELETE FROM localhost.model.Parcelado E "
				+ "WHERE E.id=:id";
		Query q = emOrca.createQuery(query);
		q.setParameter("id", p.getId());

		int resp = q.executeUpdate();

		return resp;
	}


	// ################### retorna listas #####################

	@SuppressWarnings("unchecked")
	public List<Categoria> listaCategorias() {

		List<Categoria> lista = new ArrayList<Categoria>();

		String query = "SELECT E FROM localhost.model.Categoria E order by E.descricao";
		Query q = emOrca.createQuery(query);
		lista = q.getResultList();
		return lista;

	}
	
	@SuppressWarnings("unchecked")
	public List<Conta> listaContas() {

		List<Conta> lista = new ArrayList<Conta>();

		String query = "SELECT E FROM localhost.model.Conta E order by E.descricao";
		Query q = emOrca.createQuery(query);
		lista = q.getResultList();
		return lista;

	}
	
	@SuppressWarnings("unchecked")
	public List<Categoria> listaCategoriasEntrada() {

		List<Categoria> lista = new ArrayList<Categoria>();

		String query = "SELECT E FROM localhost.model.Categoria E WHERE E.tipo<>'S' order by E.descricao";
		Query q = emOrca.createQuery(query);
		lista = q.getResultList();
		return lista;

	}
	
	@SuppressWarnings("unchecked")
	public List<Categoria> listaCategoriasSaida() {

		List<Categoria> lista = new ArrayList<Categoria>();

		String query = "SELECT E FROM localhost.model.Categoria E WHERE E.tipo<>'E' order by E.descricao";
		Query q = emOrca.createQuery(query);
		lista = q.getResultList();
		return lista;

	}
	
	@SuppressWarnings("unchecked")
	public List<Movimento> listaEntradas() {

		List<Movimento> lista = new ArrayList<Movimento>();

		String query = "SELECT E FROM localhost.model.Movimento E join fetch E.categoria "
				+ "WHERE E.tipo='E' order by E.conta.descricao, E.datao desc";
		Query q = emOrca.createQuery(query);
		lista = q.getResultList();
		return lista;

	}
	
	@SuppressWarnings("unchecked")
	public List<Movimento> listaSaidas() {

		List<Movimento> lista = new ArrayList<Movimento>();

		String query = "SELECT E FROM localhost.model.Movimento E join fetch E.categoria "
				+ "WHERE E.tipo='S' order by E.conta.descricao, E.datao desc";
		Query q = emOrca.createQuery(query);
		lista = q.getResultList();
		return lista;

	}
	
	@SuppressWarnings("unchecked")
	public List<Movimento> listaEntradasConta(Conta conta) {

		List<Movimento> lista = new ArrayList<Movimento>();

		String query = "SELECT E FROM localhost.model.Movimento E join fetch E.conta "
				+ "WHERE E.tipo='E' AND E.conta.id =:idConta order by E.datao desc";
		Query q = emOrca.createQuery(query);
		q.setParameter("idConta", conta.getId());
		lista = q.getResultList();
		return lista;

	}
	
	@SuppressWarnings("unchecked")
	public List<Movimento> listaSaidasConta(Conta conta) {

		List<Movimento> lista = new ArrayList<Movimento>();

		String query = "SELECT E FROM localhost.model.Movimento E join fetch E.conta "
				+ "WHERE E.tipo='S' AND E.conta.id =:idConta order by E.datao desc";
		Query q = emOrca.createQuery(query);
		q.setParameter("idConta", conta.getId());
		lista = q.getResultList();
		return lista;

	}
	
	@SuppressWarnings("unchecked")
	public List<Parcelado> listaParcelados() {

		List<Parcelado> lista = new ArrayList<Parcelado>();

		String query = "SELECT E FROM localhost.model.Parcelado E join fetch E.conta "
				+ "order by E.descricao";
		Query q = emOrca.createQuery(query);
		lista = q.getResultList();
		return lista;

	}
	
	@SuppressWarnings("unchecked")
	public List<Parcelado> listaParceladosConta(Conta conta) {

		List<Parcelado> lista = new ArrayList<Parcelado>();

		String query = "SELECT E FROM localhost.model.Parcelado E join fetch E.conta "
				+ "E.conta.id =:idConta order by E.descricao";
		Query q = emOrca.createQuery(query);
		q.setParameter("idConta", conta.getId());
		lista = q.getResultList();
		return lista;

	}
	
	@SuppressWarnings("unchecked")
	public List<Parcelado> listaParceladosEntradasConta(Conta conta) {

		List<Parcelado> lista = new ArrayList<Parcelado>();

		String query = "SELECT E FROM localhost.model.Parcelado E join fetch E.conta "
				+ "WHERE E.tipo='E' AND E.conta.id =:idConta order by E.descricao";
		Query q = emOrca.createQuery(query);
		q.setParameter("idConta", conta.getId());
		lista = q.getResultList();
		return lista;

	}
	
	@SuppressWarnings("unchecked")
	public List<Parcelado> listaParceladosSaidasConta(Conta conta) {

		List<Parcelado> lista = new ArrayList<Parcelado>();

		String query = "SELECT E FROM localhost.model.Parcelado E join fetch E.conta "
				+ "WHERE E.tipo='S' AND E.conta.id =:idConta order by E.descricao";
		Query q = emOrca.createQuery(query);
		q.setParameter("idConta", conta.getId());
		lista = q.getResultList();
		return lista;

	}

	// ########################################
}